package model

const (
	VaProtocolForRDP = "rdp"
	VaProtocolForSSH = "ssh"
	VaProtocolForVNC = "vnc"

	VaSessionStatusForCreate        = 1 // 创建
	VaSessionStatusForInit          = 2 // 创建但是还未完成初始化连接
	VaSessionStatusForBindWinId     = 3 // ws 连接连接时更新会话状态
	VaSessionStatusForWsBreak       = 4 // ws断开,但是tunnel还握着
	VaSessionStatusForWinBreak      = 5 // win session 断开，这是不应该出现的一个状态
	VaSessionStatusForWinDestroying = 6 // 通知win session 准备开始注销
	VaSessionStatusForWinDestroyed  = 7 // 完成注销，会话彻底结束

	VaSessionHoldForHolding = 1 // 1-握持中，可以被管理；
	VaSessionHoldForHeld    = 2 // 2-结束握持,不能被管理,Held 是 hold的过去式和过去分词
	VaSessionHoldForInit    = 3 // 3-还未开始，会话还未开始

)

type HostSession struct {
	HostSessionId    int64  `json:"hostSessionId,string" gorm:"primary_key"` //主键
	Protocol         string `json:"protocol"`                                //连接协议,可选 rdp vnc ssh
	HostId           int64  `json:"hostId,string"`
	HostIp           string `json:"hostIp"`                  // 目标主机的ip，
	ConnectPort      int    `json:"connectPort"`             // 目标主机的连接端口
	ConnectionId     string `json:"connectionId"`            // 连接ID，由客户端生成
	WinAccount       string `json:"winAccount"`              // win 账户，认证时会使用
	WinPwd           string `json:"winPwd"`                  // win 密码
	WinSessionId     int    `json:"winSessionId"`            // win 会话ID
	Width            string `json:"width"`                   // 显示屏幕宽度
	Height           string `json:"height"`                  // 显示高度
	Status           int    `json:"status"`                  // 会话状态 。
	HoldStatus       int    `json:"holdStatus"`              // 会话握持状态，1-握持中，可以被管理；2-结束握持；3-还未开始
	Message          string `json:"message"`                 // 会话备注信息
	ConnectedTime    int64  `json:"connectedTime,string"`    // 连接时间，也就是更新为using的时间，在ws握手后更新
	DisconnectedTime int64  `json:"disconnectedTime,string"` // 会话断开(注销)的时间，断开、注销 都需要更新这个值
	CreatedTime      int64  `json:"createdTime,string"`      // 记录创建的时间
	UserId           int64  `json:"userId,string"`           // 创建者ID
	ClusterId        int64  `json:"clusterId,string"`
	ClusterName      string `json:"clusterName"`
}

func (r *HostSession) TableName() string {
	return "va_host_session"
}

// CheckSessionReuseInput 检查会话是否可以复用时的输入参数
type CheckSessionReuseInput struct {
	AppId int64 `json:"appId,string" form:"appId"`
}

// CheckSessionReuseOutput 检查会话是否可以复用时的输出
type CheckSessionReuseOutput struct {
	HostSessionId int64 `json:"hostSessionId,string"` // 会话ID
	Possibility   bool  `json:"possibility"`          // 复用可能性，是否复用由用户决定
}

// OpenAppDesktopInput 打开应用桌面时需要传入的参数
type OpenAppDesktopInput struct {
	HostSessionId int64 `form:"hostSessionId,string"`
	IsReuse       bool  `form:"isReuse"` // 是否需要复用会话
	AppId         int64 `form:"appId,string"`
	IsOpen        bool  `form:"isOpen"` // 是否需要打开这个应用

	Width  string `form:"width"`
	Height string `form:"height"`
	Dpi    string `form:"dpi"`
}

// AdminSearchHostSession 管理员查询会话记录
type AdminSearchHostSession struct {
	PageInfo
	HostIp    string `form:"hostIp,omitempty"`
	Status    string `form:"status,omitempty"`
	StartTime int64  `form:"startTime,omitempty"`
	EndTime   int64  `form:"endTime,omitempty"`
}

// UserSearchHostSession 用户查询会话记录
type UserSearchHostSession struct {
	PageInfo
	HostIp    string `json:"hostIp,omitempty"`
	Status    string `json:"status,omitempty"`
	StartTime int64  `json:"startTime,string"`
	EndTime   int64  `json:"endTime,string"`
}
